package com.xiaozheng.JNADemo;

import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;

/**
 * What --
 * <br>
 * Describe --
 * <br>
 *
 * @Package: com.xiaozheng.JNADemo
 * @ClassName: ReadMemoryInterface
 * @Author: 小政同学    QQ:xiaozheng666888@qq.com
 * @CreateTime: 2021/2/24 22:23
 */
public interface ReadMemoryInterface extends Library {

    ReadMemoryInterface READ = Native.load("kernel32.dll", ReadMemoryInterface.class);


    /**
     * 通过PID 读取内存
     *
     * @param dwDesiredAccess 渴望得到的访问权限 （标志） 填2035711 表示所有能获得的权限
     * @param bInheritHandle  是否继承句柄
     * @param dwProcessId     进程标识符
     * @return
     */
    public Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, int dwProcessId);


    /**
     * 通过内存 读取对应地址的值
     *
     * @param hProcess            被读取进程的句柄
     * @param lpBaseAddress       内存地址
     * @param lpBuffer            读取内存地址存放的位置
     * @param nSize               一次读取的字节数
     * @param lpBumberOfBytesRead 实际读取的字节数
     * @return
     */
    public boolean ReadProcessMemory(Pointer hProcess, int lpBaseAddress, Memory lpBuffer, int nSize, IntByReference lpBumberOfBytesRead);

    /*
    kernel32.dll 写入内存数据的原型
        BOOL WriteProcessMemory(
                HANDLE hProcess,
                LPVOID lpBaseAddress,
                LPVOID lpBuffer,
                DWORD nSize,
                LPDWORD lpNumberOfBytesWritten
        );
    */


    /**
     * 此函数能写入某一进程的内存区域。入口区必须可以访问，否则操作将失败。
     * @param hProcess 进程句柄
     * @param lpBaseAddress 要写的内存首地址
     * @param lpBuffer 指向要写的数据的指针
     * @param nSize 要写入的字节数
     * @param lpNumberOfBytesWritten 实际数据的长度
     * @return
     */
    public boolean WriteProcessMemory(Pointer hProcess, int lpBaseAddress,Memory lpBuffer,int nSize, IntByReference lpNumberOfBytesWritten);
}